package com.dys.testlinkedlist05;

/**
 * @className: com.dys.testlinkedlist05.MyLinkedList
 * @description: com.dys.testlinkedlist05
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/08/02 下午9:55
 */
public class MyLinkedList {
    // 链表中一定有一个首节点
    Node first;

    // 链表中一定有一个尾节点
    Node last;

    // 计数器
    int count = 0;

    public MyLinkedList() {
    }

    // 添加元素的方法
    public void add(Object o) {
        // 证明添加的元素是第一个节点
        if (first == null) {
            // 将添加的元素封装为一个Node对象
            Node n = new Node();
            n.setPrev(null);
            n.setData(o);
            n.setNext(null);
            // 当前链表中第一个节点变为n
            first = n;
            // 当前链表中最后一个节点变成n
            last = n;
        } else {// 证明已经不是链表中第一个节点了
            // 将添加的元素封装为一个Node对象
            Node node = new Node();
            node.setPrev(last);
            node.setData(o);
            node.setNext(null);
            // 当前链表中最后一个节点的下一个元素需要指向n
            last.setNext(node);
            // 将最后一个节点变为node
            last = node;
        }
        // 链表中的元素数量+1
        count++;
    }

    // 得到集合中元素的数量
    public int getSize() {
        return count;
    }

    // 通过下标得到元素
    public Object get(int index) {
        // 获取链表的头元素
        Node node = first;
        // 一路next得到想要的元素
        for (int i = 0; i < index; i++) {
            node = node.getNext();
        }
        return node.getData();
    }
}

class Test {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) {
        MyLinkedList ml = new MyLinkedList();
        ml.add("abc");
        ml.add("def");
        ml.add("hgk");
        for (int i = 0; i < ml.getSize(); i++) {
            System.out.println(ml.get(i));
        }
        System.out.println(ml.getSize());
    }
}
